package com.jiepos.mpos.pay.quickpay.service.laidouzhenpay;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import com.alibaba.fastjson.JSON;
import com.betterda.paycloud.sdk.util.Base64Util;
import com.betterda.paycloud.sdk.util.KeyGenerator;
import com.betterda.paycloud.sdk.util.PlatService;
import com.jiepos.mpos.common.constant.SystemConstant;
import com.jiepos.mpos.core.util.DateUtil;
import com.jiepos.mpos.core.util.GlobalUtils;
import com.jiepos.mpos.core.util.MathUtils;
import com.jiepos.mpos.pay.CommonService;
import com.jiepos.mpos.pay.quickpay.service.AtrPayService;
import com.jiepos.mpos.pay.quickpay.service.IQuickPayService;

/**
 * 标题: 快捷支付通道(来逗阵) 
 * 模块: 支付平台 
 * 版权: Copyright (c) 2017 江苏杰博实信息技术有限公司
 * @author 杨剑武
 * @version 1.0
 * @since 2017年9月30日 上午11:00:00 
 * @history（历次修订内容、修订人、修订时间等）
 */
@Service("LAIDOUZHEN_LARGE")
@SuppressWarnings("rawtypes")
public class LaiDouZhenPayService extends AtrPayService implements IQuickPayService {
	private static final Logger _log = LoggerFactory.getLogger(LaiDouZhenPayService.class);

	@Override
	public Map payOrder(String channelMchntCd, String orderNo, String orderAmt, String mobile, String certNo,
			String userName, String cardNo, String remark, Map dataMap) {
		String respData = null;
		try {
			String orderId = String.valueOf(dataMap.get("loc_trace_no"));// 上送渠道的订单号(本地流水号)
			String txnAmt = CommonService.subString(
					String.valueOf(MathUtils.mul(Double.valueOf(String.valueOf(dataMap.get("trans_at"))), 100)));// 订单金额
			String txnTime = DateUtil.getCurrDateTimeStr();// 订单发送时间
			String accNo = String.valueOf(dataMap.get("act_out_no"));// 交易卡号
			String realName = String.valueOf(dataMap.get("real_name"));// 真实姓名
			String identityNo = String.valueOf(dataMap.get("certificate_no"));// 身份证号
			String phoneNo = String.valueOf(dataMap.get("phone"));// 电话号码
			String toAccNo = String.valueOf(dataMap.get("settle_acct"));// 到账卡号;
			String toAccName = String.valueOf(dataMap.get("real_name"));// 卡号对应用户名
			String toBankName = String.valueOf(dataMap.get("bank_nm"));// 到账银行卡名称
			String userFee = CommonService.subString(
					String.valueOf(MathUtils.mul(Double.valueOf(String.valueOf(dataMap.get("midfee"))), 100)));// 手续费
			String extFiled = "快捷支付";// (无商品信息，暂定快捷支付)
			String toBankCode = String.valueOf(dataMap.get("cnapsno"));// 入账银行联行号
			String terminalMerCode = String.valueOf(dataMap.get("terminalMerCode"));// 终端用/商户代码
			String terminalMerName = String.valueOf(dataMap.get("terminalMerName"));// 终端用/商户名称
			String terminalMerState = String.valueOf(dataMap.get("terminalMerState"));// 终端用/商户所在省份
			String terminalMerCity = String.valueOf(dataMap.get("terminalMerCity"));// 终端用/商户所在城市
			String terminalMerAddress = String.valueOf(dataMap.get("terminalMerAddress"));// 终端用/商户详细地址
			String t0drawFee = String.valueOf(dataMap.get("t0drawFee"));// 单笔T0提现交易手续费
			String t0drawRate = String.valueOf(dataMap.get("t0drawRate"));// T0提现交易手续费扣率
			String t1consFee = String.valueOf(dataMap.get("t1consFee"));// 单笔消费交易手续费
			String t1consRate = String.valueOf(dataMap.get("t1consRate"));// 消费交易手续费扣率

			String[] requestParams = StringUtils.split(GlobalUtils.getPayConfProperty("pay.ys.request.params"), "|");
			String[] requestValues = { String.valueOf(dataMap.get("trf_mchnt_cd")),
					GlobalUtils.getPayConfProperty("pay.ys.channeltype"), GlobalUtils.getPayConfProperty("pay.ys.version"), orderId,
					txnAmt, txnTime, accNo, realName, identityNo, phoneNo, toAccNo, toAccName, toBankName, userFee,
					extFiled, toBankCode, terminalMerCode, terminalMerName, terminalMerState, terminalMerCity,
					terminalMerAddress, t1consRate, t1consFee, t0drawRate, t0drawFee,
					dataMap.get("payUrl") + GlobalUtils.getPayConfProperty("pay.ys.notice.fronturl"),
					dataMap.get("payUrl") + GlobalUtils.getPayConfProperty("pay.ys.notice.url") };
			Map<String, String> paramsMap = new HashMap<String, String>();
			for (int index = 0, length = requestParams.length; index < length; index++) {
				paramsMap.put(requestParams[index], requestValues[index]);
			}
			Map<String, String> reqData = new HashMap<String, String>();
			reqData.put("data",
					Base64Util.encode(KeyGenerator.encryptByPublicKey(
							JSON.toJSONString(paramsMap).getBytes(SystemConstant.UTF_ENCODING),
							String.valueOf(dataMap.get("master_key")))));
			_log.info("快捷支付请求数据为：[明文={},密文={}],", paramsMap,reqData);
			String requestUrl = String.format(GlobalUtils.getPayConfProperty("pay.ys.request.url"),
					GlobalUtils.getPayConfProperty("pay.ys.channeltype"), String.valueOf(dataMap.get("trf_mchnt_cd")));
			respData = PlatService.postAsString(reqData, requestUrl, SystemConstant.UTF_ENCODING);
			_log.info("快捷支付响应数据为：[{}]", respData);
			Map<String, String> reqMap = new HashMap<String, String>();
			reqMap.put("loc_trace_no", String.valueOf(dataMap.get("loc_trace_no")));
			reqMap.put("sourceData", respData);
			return getStandardData(reqMap);
		} catch (Exception e) {
			_log.error("快捷支付发生异常", e);
			return null;
		}
		
	}

	@Override
	public boolean noticeOrder(Map<String, String> paramMap) {
		_log.info("异步通知原始数据map=[{}]",paramMap);
		Map<String, String> standardMap = noticeStandard(paramMap);
		boolean flag = false;
		try {
			flag = noticeService.noticeUpdate(standardMap);
		} catch (Exception e) {
			flag = false;
			_log.error("异步通知更新发生异常", e);
		}
		return flag;
	}

	/**
	 * 标准化异步通知报文
	 * 
	 * @param payResMap
	 * @return
	 */
	public Map<String, String> noticeStandard(Map<String, String> payResMap) {

		Map<String, String> standardDataMap = new HashMap<String, String>();
		standardDataMap.put("trf_mchnt_cd", "");// 商户编号（渠道）
		standardDataMap.put("trf_term_id", "");// 终端编号（渠道）
		standardDataMap.put("complete_dt", payResMap.get("payTime").substring(0, 8));// 订单完成日期（渠道）
		standardDataMap.put("complete_ts", payResMap.get("payTime").substring(8));// 订单完成时间（渠道）
		standardDataMap.put("custom_no", "");// 商户编号（支付系统）
		standardDataMap.put("term_id", "");// 终端编号（支付系统）
		standardDataMap.put("trf_trace_no", payResMap.get("queryId"));// 渠道方流水号（渠道）
		standardDataMap.put("loc_trace_no", payResMap.get("orderId"));// 本地流水号（支付系统）

		standardDataMap.put("trs_stat",
				CommonService.encapRespCode(payResMap.get("payStatus"), payResMap.get("errorCode")));// 交易状态
		String stlst = CommonService.encapSettleRespCode(payResMap.get("settleStatus"));
		standardDataMap.put("stlst", stlst);// 清算状态（出款状态）
		standardDataMap.put("stl_dt", payResMap.get("settleDate"));// 清算日期
		standardDataMap.put("midfee", "");// 商户手续费
		standardDataMap.put("stl_amt", payResMap.get("settleAmt"));// 结算金额
		standardDataMap.put("trans_at", payResMap.get("txnAmt"));// 交易金额
		String rspcode = CommonService.encapRespCode(payResMap.get("payStatus"), payResMap.get("errorCode"));
		String rspmsg = SystemConstant.RSPCODE_SUCCESS.equals(rspcode) ? SystemConstant.RSPCODE_SUCCESS_PAY
				: String.valueOf(noticeService.getRspCodeListMap().get(rspcode));
		standardDataMap.put("rspcode", rspcode);// 返回码
		standardDataMap.put("rspmsg", rspmsg);// 返回信息描述
		standardDataMap.put("pay_dt", payResMap.get("payTime").substring(0, 8));// 出款日期
		standardDataMap.put("pay_ts", payResMap.get("payTime").substring(8));// 出款时间
		_log.info("标准化异步通知报文map=[{}]", standardDataMap);
		return standardDataMap;
	}

	/**
	 * 渠道主动查询
	 * 
	 * @param queryMap
	 * @return
	 */

	@Override
	public Map<String, String> queryChannelOrder(Map<String, String> queryMap) {
		String respData = null;
		try {
			Map<String, String> dataMap = mainBusinessService.getMasterKeyByLocTraceNo(queryMap.get("loc_trace_no"));
			_log.info("根据流水号查询渠道对应的map[{}]", dataMap);
			if (dataMap.get(SystemConstant.RSP_CODE) == null) {
				Map<String, String> paramsMap = new HashMap<String, String>();
				paramsMap.put("appId", dataMap.get("trf_mchnt_cd"));// appId
				paramsMap.put("paymentType", GlobalUtils.getPayConfProperty("pay.ys.paymentType"));// 出款类型，10为T+1,20为D0
				paramsMap.put("channelType", GlobalUtils.getPayConfProperty("pay.ys.channeltype"));// 渠道类型，快捷支付T1为11，快捷支付D0为10
				paramsMap.put("version", GlobalUtils.getPayConfProperty("pay.ys.version"));// 版本号
				paramsMap.put("orderId", queryMap.get("loc_trace_no"));// 订单号
				paramsMap.put("txnTime", DateUtil.getCurrDateTimeStr());// 交易时间
				Map<String, String> reqData = new HashMap<String, String>();
				reqData.put("data",
						Base64Util.encode(KeyGenerator.encryptByPublicKey(
								JSON.toJSONString(paramsMap).getBytes(SystemConstant.UTF_ENCODING),
								dataMap.get("master_key"))));
				String requestUrl = String.format(GlobalUtils.getPayConfProperty("pay.ys.request.sdk.url"),
						GlobalUtils.getPayConfProperty("pay.ys.channeltype"), dataMap.get("trf_mchnt_cd"));
				_log.info("快捷支付请求数据为=[明文={},密文={}],请求地址url=[{}]", paramsMap,reqData, requestUrl);
				respData = PlatService.postAsString(reqData, requestUrl, SystemConstant.UTF_ENCODING);
				_log.info("快捷支付响应数据为：[{}]", respData);
				return respMap(
						CommonService.parseJsonToMap(respData, new HashMap<String, String>()),
						queryMap, queryMap.get("loc_trace_no"));
			} else {
				_log.error("[{}]流水号无渠道对应的主密钥的map[{}]", queryMap.get("loc_trace_no"), dataMap);
			}
		} catch (Exception e) {
			_log.error("快捷支付主动查询发生异常", e);
		}
		return null;
	}



	/**
	 * 
	 * <功能描述>渠道响应报文转标准报文
	 * 
	 * @param respData
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	private Map<String, String> respMap(Map<String, String> respData, Map<String, String> queryMap, String loc_trace_no)
			throws Exception {
		Map<String, String> respMap = new HashMap<String, String>();
		Map<String, String> infoMap = appLogTransJnlsPayService.getTranInfo(loc_trace_no);
		respMap.put("trf_mchnt_cd", infoMap.get("trf_mchnt_cd"));// 商户编号（渠道）
		respMap.put("trf_term_id", infoMap.get("trf_term_id"));// 终端编号（渠道）
		respMap.put("custom_no", infoMap.get("custom_no"));// 客户编号（支付系统）
		respMap.put("loc_trace_no", loc_trace_no);// 本地流水号（支付系统)
		respMap.put("stlst", infoMap.get("stlst"));// 清算状态(待定)
		respMap.put("trans_at", String.valueOf(MathUtils.mul(Double.valueOf(infoMap.get("trans_at")), 100)));// 交易金额(数据库查询)
		respMap.put("midfee", String.valueOf(MathUtils.mul(Double.valueOf(infoMap.get("midfee")), 100)));// 商户手续费
		String rspcode = infoMap.get("rspcode");// 返回码
		String rspmsg = infoMap.get("rspmsg");// 交易返回信息
		if (SystemConstant.LAIDOUZHEN_SUCCESS.equals(respData.get("payStatus"))) {
			respMap.put("complete_dt", respData.get("payTime").substring(0, 8));// 订单完成日期（渠道）
			respMap.put("complete_ts", respData.get("payTime").substring(8, respData.get("payTime").length()));// 订单完成日期（渠道）
			respMap.put("term_id", respData.get("term_id"));// 终端编号（支付系统）
			respMap.put("trf_trace_no", respData.get("queryId"));// 渠道方流水号（渠道）
			respMap.put("trs_stat", CommonService.encapRespCode(respData.get("payStatus"), respData.get("errorCode")));// 交易状态
			respMap.put("stl_dt", respData.get("settleDate"));// 清算日期
			respMap.put("stl_amt", respData.get("settleAmt"));// 结算金额
			respMap.put("stlst", CommonService.encapSettleRespCode(respData.get("settleStatus")));// 清算状态
			respMap.put("pay_dt", respData.get("payTime").substring(0, 8));// 出款日期
			respMap.put("pay_ts", respData.get("payTime").substring(8, respData.get("payTime").length()));// 出款时间

		} else if (respData.get("payStatus") == null) {
			respData.put("payStatus", "N");
		}
		rspcode = CommonService.encapRespCode(respData.get("payStatus"), respData.get("errorCode"));
		rspmsg = SystemConstant.RSPCODE_SUCCESS.equals(rspcode) ? SystemConstant.RSPCODE_SUCCESS_PAY
				: (!StringUtils.isEmpty(respData.get("msg")) ? respData.get("msg"):String.valueOf(noticeService.getRspCodeListMap().get(rspcode)));
		respMap.put("errorCode", respData.get("errorCode"));// 渠道返回码
		respMap.put("msg", respData.get("msg"));// 渠道返回信息
		respMap.put("rspcode", rspcode);// 返回码
		respMap.put("rspmsg", rspmsg);// 交易返回信息
		_log.info("来逗阵渠道主动查询标准报文map=[{}]", respMap);
		return respMap;
	}
	
	@Override
	public Map<String, String> verifyCode(Map<String, String> reqMap) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public Map<String, String> getStandardData(Map<String, String> reqMap) throws Exception {
		Map<String, String> respMap = new HashMap<String, String>();
		Assert.notNull(reqMap.get("loc_trace_no"));
		Map<String, String> infoMap = appLogTransJnlsPayService.getTranInfo(reqMap.get("loc_trace_no"));
		log.info("来逗阵支付响应报文为:[{}],[{}]交易对应的查询数据为:[{}]",reqMap,reqMap.get("loc_trace_no"),infoMap);
		Map<String, Object> traceTime = mainBusinessService.getSystemTime();
		respMap.put("loc_dt", String.valueOf(traceTime.get("loc_dt")));//交易日期
		respMap.put("loc_ts", String.valueOf(traceTime.get("loc_ts")));//交易日期
		respMap.put("trf_mchnt_cd", infoMap.get("trf_mchnt_cd"));// 商户编号（渠道）
		respMap.put("trf_mchnt_cd", infoMap.get("trf_mchnt_cd"));// 商户编号（渠道）
		respMap.put("trf_term_id", infoMap.get("trf_term_id"));// 终端编号（渠道）
		respMap.put("complete_dt", reqMap.get("complete_dt"));// 订单完成日期（渠道）
		respMap.put("complete_ts", reqMap.get("complete_ts"));// 订单完成时间
		respMap.put("custom_no", infoMap.get("custom_no"));// 客户编号（支付系统）
		respMap.put("term_id", reqMap.get("term_id"));// 本地流水号（支付系统)
		respMap.put("trf_trace_no", reqMap.get("trf_trace_no"));// 渠道方流水号（渠道）
		respMap.put("loc_trace_no", reqMap.get("loc_trace_no"));
		respMap.put("trs_stat", reqMap.get("trs_stat"));// 交易状态
		respMap.put("stlst", infoMap.get("stlst"));// 清算状态
		respMap.put("midfee", infoMap.get("midfee"));// 商户手续费
		respMap.put("stl_amt", reqMap.get("stl_amt"));// 结算金额
		respMap.put("rspcode", SystemConstant.RSPCODE_SUCCESS);// 返回码
		respMap.put("rspmsg", reqMap.get("rspmsg"));// 交易返回信息
		respMap.put("action", reqMap.get("action"));// 银联跳转页面
		respMap.put("data",  reqMap.get("data"));// 支付数据
		respMap.put("url",  reqMap.get("url"));// 未使用
		respMap.put("sourceData", reqMap.get("sourceData"));// 交易返回信息
		respMap.put("channel_type", SystemConstant.CHANNEL_TYPE_H5);
		log.info("来逗阵支付响应响应报文转标准化系统处理报文[{}]",respMap);
		return respMap;
	}

	@Override
	public Map<String, String> queryChannelStlResult(Map<String, String> queryMap) {
		return null;
	}

	@Override
	public Map<String, String> sendVerifyCode(Map<String, String> reqMap) {
		return null;
	}
}
